package com.java.util;

import java.util.*;
import java.io.*;
import java.util.Calendar;
import java.text.*;

public class CommonUtil {
	public CommonUtil() {
        super();
    }

    /**
     * null => ""
     */
    public static String nullToSpace(String str)
    {
        String retValue;
        if (str == null || str.trim().equals("")) {
            retValue = "";
        } else {
            retValue = str;
        }
     	return retValue;
    }

    public static String nullToSpace(String str, String reStr)
    {
        String retValue;
        if (str == null || str.trim().equals("")) {
            retValue = reStr;
        } else {
            retValue = str;
        }
        return retValue;
    }

    /**
     *<pre>
     * Descriptions: 문자열 치환하는 기능을 한다.
     *</pre>
     * @param  String in      : 송신 메일의 포맷 파일 내용
     * @param  String find    : 변경할 타겟 문자열
     * @param  String replace : 치환할 문자열
     * @return String         : 수정된 문자열
     */
     public static String replaceStringAll(String in, String find, String replace )
     {
        if (in == null) {
            return "";
        }

        String source = in;
        String keyStr = find;
        String toStr = replace;

        int startIndex = 0;
        int curIndex = 0;
        StringBuffer result = new StringBuffer();

        while (( curIndex = source.indexOf(keyStr, startIndex) ) >= 0) {
            result.append(source.substring(startIndex, curIndex)).append(toStr);
            startIndex = curIndex + keyStr.length();
        }

       if (startIndex <= source.length() ) {
               result.append(source.substring(startIndex, source.length()));
       }

        return result.toString();
     }


     /**
      * 문자열 내의 특정한 문자열을 모두 지정한 다른 문자열로 바꾼다.
      * 원본 String 이 null 일 경우에는 null 을 반환한다.
      * StringBuffer 를 이용하였으므로 이전의 String 을 이용한 것 보다
      * 월등히 속도가 빠르다. (약 50 ~ 60 배)
      *
      * 사용 예: <BR>
      *
      *   1. 게시판에서 HTML 태그가 안 먹히게 할려면
      *
      *      String str = "<TD>HTML Tag Free Test</TD>";
      *      str = replace(str, "&", "&amp;");
      *      str = replace(str, "<", "&lt;");
      *
      *   2. ' 가 포한된 글을 DB 에 넣을려면
      *
      *      String str2 = "I don't know.";
      *      str2 = replace(str2, "'", "''");
      *
      * @param   String src       원본 String
      * @param   String oldstr    원본 String 내의 바꾸기 전 문자열
      * @param   String newstr    바꾼 후 문자열
      * @return  String           치환이 끝난 문자열
      *
      * @date    2003/07/25
      * @author  배민수
      */
     public static String replace(String src, String oldstr, String newstr) {
         if (src == null)
             return null;

         StringBuffer dest = new StringBuffer("");
         int len = oldstr.length();
         int srclen = src.length();
         int pos = 0;
         int oldpos = 0;

         while ((pos = src.indexOf(oldstr, oldpos)) >= 0) {
             dest.append(src.substring(oldpos, pos));
             dest.append(newstr);
             oldpos = pos + len;
         }

         if (oldpos < srclen)
             dest.append(src.substring(oldpos, srclen));

         return dest.toString();
     }

     /**
      DESC : Blank 대신 &nbsp;로 변환
      **/
     public static String replaceString(String str) {
         StringBuffer buf = new StringBuffer();
         /* 2002.10.01 수정 : str.length() -1 => str.length() */
         for (int i = 0; i < str.length(); i++) {
             if (str.charAt(i) != ' ') {
                 buf.append(str.charAt(i));
             } else {
                 buf.append("&nbsp;");
             }
         }
         return buf.toString();
     }

     public static String replaceString(String src, String from, String to)
    {
        if(src == null)  return "";
        if(from == null) return "";
        if(to == null)   return "";

        StringBuffer buf = new StringBuffer();

        for(int pos; (pos = src.indexOf(from)) >= 0; ) {
            buf.append(src.substring(0,pos));
            buf.append(to);

            src = src.substring(pos + from.length());
        }

        buf.append(src);

        return buf.toString();
    }

     /**
      DESC : 올림수 적용하고 소수점 이하 자릿수를 맞춘다.
      **/
     public String roundBigDec(double value, int seq) {
         double upvalue = 0; // 올림수

         if (seq == 0)
             upvalue = 0.5;
         else if (seq == 1)
             upvalue = 0.05;
         else if (seq == 2)
             upvalue = 0.005;
         else if (seq == 3)
             upvalue = 0.0005;
         else if (seq == 4)
             upvalue = 0.00005;
         else if (seq == 5)
             upvalue = 0.000005;
         else if (seq == 6)
             upvalue = 0.0000005;
         else
             upvalue = 0;
         // ---
         java.math.BigDecimal newValue = null;
         if (value < 0)
             newValue = new java.math.BigDecimal(value - upvalue);
         else
             newValue = new java.math.BigDecimal(value + upvalue);
         // ---
         String result = String.valueOf(newValue);
         int pos = result.indexOf(".");

         if (pos < 0)
             return result;
         else if (seq == 0) {
             result = result.substring(0, pos + seq);
         } else {
             result = result.substring(0, pos + seq + 1);
         }

         return result;
     }

     /**
      DESC : 숫자형식에 콤마(,) 찍어주기 ( 예. 123456.78 -> 123,456.78 )
      **/
     public String setComma(double number, boolean flag, int seq) {
         return setComma((flag) ? setFloor(number, seq) : String.valueOf(number));
     }

     /**
      DESC : 숫자형식에 콤마(,) 찍어주기 ( 예. 123456.78 -> 123,456.78 )
      **/
     public static String setComma(String number) {
         String result = "";
         String tail = "";
         boolean flag = false;

         if (number.equals("")) return result;
         int pts = number.indexOf(".");
         if (pts > 0) {
             tail = number.substring(pts);
             number = number.substring(0, pts);
         }

         if (Long.parseLong(number) < 0) {
             number = String.valueOf(Long.parseLong(number) * (-1));
             flag = true;
         }
         int len = number.length();
         if (!number.equals("")) {
             StringBuffer buffer = new StringBuffer(number);
             for (int i = len - 3; i > 0; i -= 3)
                 buffer.insert(i, ',');
             if (pts > 0)
                 result = buffer.toString() + tail;
             else
                 result = buffer.toString();
             if (flag) result = "-" + result;
         }

         return result;
     }

     /**
      DESC : 숫자형식에 콤마(,) 찍어주기 ( 예. 123456.78 -> 123,456.78 )
      flag :
      **/
     public String setComma(String number, boolean flag, int seq) {

         return setComma((flag) ? setFloor(number, seq) : number);
     }

     public String setCommaDouble(double number) {
         return setComma(number + "");
     }

     public String setCommaFloat(String number) {
         String result = "";
         String tail = "";
         boolean flag = false;
         if (number.equals("")) return result;
         int pts = number.indexOf(".");

         if (pts > 0) {
             tail = number.substring(pts);
             number = number.substring(0, pts);
         }

         if (Long.parseLong(number) < 0) {
             number = String.valueOf(Long.parseLong(number) * (-1));
             flag = true;
         }

         int len = number.length();
         if (!number.equals("")) {
             StringBuffer buffer = new StringBuffer(number);
             for (int i = len - 3; i > 0; i -= 3)
                 buffer.insert(i, ',');
             if (pts > 0)
                 result = buffer.toString() + tail;
             else
                 result = buffer.toString();
             if (flag) result = "-" + result;
         }

         return result;
     }

     public String setCommaFloat(String number, int Length) {
         String result = "";
         String tail = "";
         boolean flag = false;
         if (number.equals("")) return result;
         int pts = number.indexOf(".");

         if (pts > 0) {
             tail = number.substring(pts);
             number = number.substring(0, pts);
         }

         if (Long.parseLong(number) < 0) {
             number = String.valueOf(Long.parseLong(number) * (-1));
             flag = true;
         }

         int len = number.length();
         if (!number.equals("")) {
             StringBuffer buffer = new StringBuffer(number);
             for (int i = len - 3; i > 0; i -= 3)
                 buffer.insert(i, ',');
             if (pts > 0)
                 result = buffer.toString() + tail;
             else
                 result = buffer.toString();
             if (flag) result = "-" + result;

         }

         if (Length > 0) {
             result += ".";
             for (int i = 0; i < Length; i++) {
                 result += "0";
             }

         }

         return result;
     }

     public String setCommaInt(int number) {
         return setComma(number + "");
     }

     public String setCommaLong(long number) {
         return setComma(number + "");
     }

     public String setFloor(double d_qty) {
         String str = String.valueOf(d_qty);
         return setFloor(str);
     }

     public String setFloor(double value, int seq) {
         return setFloor(roundBigDec(value, seq));
     }

     public String setFloor(String str) {
         int pos = 0;
         String buf = "";
         String temp = "";
         if (str.toString() == null || str.equals("") )
             return "";

         pos = str.indexOf(".");

         if (pos < 0)
             return str;

         buf = str.substring(pos + 1, str.length());

         int i = 0;

         for (i = buf.length(); i > 0; i--) {
             if (buf.charAt(i - 1) != '0')
                 break;
         }

         if (i > 0)
             buf = buf.substring(0, i);
         long lvalue = Long.parseLong(buf);

         if (lvalue > 0)
             temp = "." + buf;
         return str.substring(0, pos) + temp;
     }

     public String setFloor(String value, int seq) {
         return setFloor(roundBigDec(Double.valueOf(value).doubleValue(), seq));
     }

     /*
      Desc : 백분율 소수 2째 자리까지 구함.
      */
     public String setPercent(double arg1, double arg2) {
         double arg3 = 0;

         if (arg1 != 0)
             arg3 = ((arg2 - arg1) / arg1) * 100;
         else
             arg3 = 0;

         return roundBigDec(arg3, 2);
     }

     /*
      Desc : 백분율 소수 seq째 자리까지 구함.
      */
     public String setPercent(double arg1, double arg2, int seq) {
         double arg3 = 0;

         if (arg1 != 0)
             arg3 = ((arg2 - arg1) / arg1) * 100;
         else
             arg3 = 0;

         return roundBigDec(arg3, seq);
     }

     /*
      Desc : 백분율 소수 2째 자리까지 구함.
      */
     public String setPercent1(double arg1, double arg2) {

         double arg3 = 0;


         if (arg1 != 0)
             arg3 = (arg2 / arg1) * 100;
         else
             arg3 = 0;

         return roundBigDec(arg3, 2);
     }

     /*
      Desc : 백분율 소수 seq째 자리까지 구함.
      */
     public String setPercent1(double arg1, double arg2, int seq) {
         double arg3 = 0;

         if (arg1 != 0)
             arg3 = (arg2 / arg1) * 100;
         else
             arg3 = 0;

         return roundBigDec(arg3, seq);
     }

     /*
      * 문자를 seq만큼 절사하여 String형으로 리턴한다.
      * 소수점 이하 자리가 없음으로 리턴
      */
     public String setTruc(double d_qty) {
         String source = String.valueOf(d_qty);
         return setTruc(source, 0);
     }

     /*
      * 문자를 seq만큼 절사하여 String형으로 리턴한다.
      * seq : 소수점이하 자리수
      */
     public String setTruc(double d_qty, int seq) {

         String source = String.valueOf(d_qty);
         return setTruc(source, seq);
     }

     /*
      * 문자를 seq만큼 절사하여 String형으로 리턴한다.
      * 소수점 이하 자리가 없음으로 리턴
      */
     public String setTruc(String source) {

         if(source == null || source.equals("")) source = "0";
         return setTruc(source ,0);
     }

     /*
      * 문자를 seq만큼 절사하여 String형으로 리턴한다.
      * seq : 소수점이하 자리수
      */
     public String setTruc(String source, int seq) {
         if(source == null || source.equals("")) source = "0.0";

         int pts = source.indexOf(".");
         if(pts>0){
            String str = source.substring(pts+1);
            if( str.length() < seq ){
                for ( int i = 1; i < seq ; i++ )
                    source = source + "0";
            }
            if (seq == 0) {
                source = source.substring(0, pts + seq);
            } else {
                source = source.substring(0, pts + seq + 1);
            }
         }
         else{
            if( seq > 0 ){
                source = source+".";
                for ( int i = 0; i < seq ; i++ )
                    source = source + "0";
            }
         }
         return source;
     }

    /**
     * 문자를 seq만큼 절사하여 String형으로 리턴한다.
     * seq : 소수점이하 자리수
     */
    public String setTrunc(String source, int seq) {
        if (source == null || source.equals(""))
            source = "0.0";

        int pts = source.indexOf(".");
        switch (pts) {
            case -1 :
                if (seq > 0) {
                    source = source + ".";
                    for (int i = 0; i < seq; i++)
                        source = source + "0";
                }
                break;
            default :
                String str = source.substring(pts + 1);
                if (str.length() < seq) {
                    for (int i = 1; i < seq; i++)
                        source = source + "0";
                }
                if (seq == 0) {
                    source = source.substring(0, pts + seq);
                } else {
                    source = source.substring(0, pts + seq + 1);
                }
        }
        return source;
    }

     /*
      * 문자를 seq만큼 절사하여 Double형으로 리턴한다.
      * 소수점 이하 자리가 없음으로 리턴
      */
     public double setTrucDouble(double d_qty) {

         String source = String.valueOf(d_qty);
         return setTrucDouble(source, 0);
     }
     /*
      * 문자를 seq만큼 절사하여 Double형으로 리턴한다.
      * seq : 소수점이하 자리수
      */
     public double setTrucDouble(double d_qty, int seq) {

         String source = String.valueOf(d_qty);
         return setTrucDouble(source, seq);
     }
     /*
      * 문자를 seq만큼 절사하여 Double형으로 리턴한다.
      * 소수점 이하 자리가 없음으로 리턴
      */
     public double setTrucDouble(String source) {

         if(source == null || source.equals("")) source = "0";
         return setTrucDouble(source ,0);
     }
     /*
      * 문자를 seq만큼 절사하여 Double형으로 리턴한다.
      * seq : 소수점이하 자리수
      */
     public double setTrucDouble(String source, int seq) {

         if(source == null || source.equals("")) source = "0.0";

         int pts = source.indexOf(".");
         if(pts>0){
            String str = source.substring(pts+1);
            if( str.length() < seq ){
                for ( int i = 1; i < seq ; i++ )
                    source = source + "0";
            }
            if (seq == 0) {
                source = source.substring(0, pts + seq);
            } else {
                source = source.substring(0, pts + seq + 1);
            }
         }
         else{
            if( seq > 0 ){
                source = source+".";
                for ( int i = 0; i < seq ; i++ )
                    source = source + "0";
            }
         }
         return Double.valueOf(source).doubleValue();
     }
         public String toEng(String s) {
             s = s.trim();
             try {
                 if (s != null) return (new String(s.getBytes("KSC5601"), "8859_1"));
                 return s;
             } catch (UnsupportedEncodingException e) {
                 //return "Encoding Error";
             }
             return s;
           }
     /*
     Webg030d.jsp 테이블col값 날자CHECK 0 값 숨기기.
     */

     public String toHide(String strDate, int val) {
         if (!strDate.equals("")) {
             return setCommaInt(val);
         } else {
             return "";
         }
     }

     /*
     Webg030d.jsp 테이블col값 날자CHECK 0 값 숨기기.
     */
     public String toHide(String strDate, String val) {
         if (!strDate.equals("")) {
             return val;
         } else {
             return "";
         }
     }

     public String toKSC5601(String s) {
         s = s.trim();
         try {
             if (s != null) return (new String(s.getBytes("8859_1"), "KSC5601"));
             return s;

         } catch (UnsupportedEncodingException e) {
             return "Encoding Error";
         }
     }
     /*
        Desc : 숫자 값이 '0'이면화면에 Display하지 않기 위해...
     */
     public String zeroHide(String arg1) {

         String retValue = "";

         if (arg1.equals("0") || arg1.equals("0.0") || arg1.equals("0.00"))
             retValue = "";
         else
             retValue = arg1;

         return retValue;
     }


     /**
     Sting를 encode하기
      * Translates a string into <code>x-www-form-urlencoded</code> format.
      *
      * @param   s   <code>String</code> to be translated.
      * @return  the translated <code>String</code>.
      * @see     java.net.URLEncoder#encode(java.lang.String)
      */
     public String encode(String s) {
         //return s;
         return java.net.URLEncoder.encode(s);
     }
     public String decode(String s) {
       //return s;
       return java.net.URLDecoder.decode(s);
     }
     /* br 처리하기 */
     public static String replaceBR(String p_str) {
        if (p_str == null) {
            p_str = "";
        } else {
            p_str = p_str.trim();
            p_str = replace(p_str, "\n", "<br>");
        }
        return p_str;
     }

     /* br 처리하기 */
     public static String replaceBR2(String p_str) {

        if (p_str == null) {
            p_str = "";
        } else {
            p_str = p_str.trim();

            p_str = replace(">"+p_str, "\n", ">");
        }
        return p_str;
     }


    //   16. 현재 년
    public static int getYear() {
        return getCalendar().get(Calendar.YEAR);
    }
    //17. 현재 달
    public static int getMonth() {
        return getCalendar().get(Calendar.MONTH) + 1;
    }
    //18. 현재 일
    public static int getDay() {
        return getCalendar().get(Calendar.DAY_OF_MONTH);
    }

    //한국 기준 시간
    public static Calendar getCalendar() {
        Calendar calendar = Calendar.getInstance();
        calendar.roll(Calendar.HOUR_OF_DAY, 9); // korean time
        return calendar;
    }

    //숫자값을 받아서 천단위 콤마 로 변환.
    public static String numComa(int data){
        String pr= "0";
        try{
            pr = NumberFormat.getInstance().format(data);
        }catch(Exception e){
            pr = data+"";
        }
        return pr;
    }
    //문자값을 받아서 천단위 콤마 로 변환.
    public static String numComa(String data){
        if(data == null) return "0";

        String returnData ="0";
        try{
            returnData = numComa(Integer.parseInt(data));
        }catch(Exception e){
            returnData = data;
        }
        return returnData;
    }
    /*
    string 으로 데이타 받아서 천단위 보여주기
        소숫점 한자리로 보여주기
    return : #,##0.00
    */
    public static String toDecFormat1(String value)
    {
        if(value == null) return "";

        double dValue = Double.valueOf(value).doubleValue();

        DecimalFormat df = new DecimalFormat("#,##0.0");

        return df.format(dValue);
    }

    public static String toDecFormat2(String value)
    {
        if(value == null) return "";

        double dValue = Double.valueOf(value).doubleValue();

        DecimalFormat df = new DecimalFormat("#,##0.00");

        return df.format(dValue);
    }

    /**
     * @param s : YYYYMMDD, YYYY/MM/DD, YYYY-MM-DD, YYMMDD, YY/MM/DD, YYYY, MM, DD
     *            WEEK (0,1,2..), WEEK_KR(월,화,수..), WEEK_EN(sun, mon..)
     * @return  : s 형식에 맞는 현재 날짜. 시간등을 return
     */
    public static String getToday(String s){
        GregorianCalendar gregoriancalendar = new GregorianCalendar();
        if(s.equals("YYYYMMDD"))
        {
            String s1 = Long.toString(gregoriancalendar.get(1));
            String s5 = Long.toString(gregoriancalendar.get(2) + 1);
            String s10 = Long.toString(gregoriancalendar.get(5));
            if(s5.length() == 1)
                s5 = "0" + s5;
            if(s10.length() == 1)
                s10 = "0" + s10;
            return s1 + s5 + s10;
        }
        if(s.equals("YYYY/MM/DD"))
        {
            String s2 = Long.toString(gregoriancalendar.get(1));
            String s6 = Long.toString(gregoriancalendar.get(2) + 1);
            String s11 = Long.toString(gregoriancalendar.get(5));
            if(s6.length() == 1)
                s6 = "0" + s6;
            if(s11.length() == 1)
                s11 = "0" + s11;
            return s2 + "/" + s6 + "/" + s11;
        }
        if(s.equals("YYYY-MM-DD"))
        {
            String s2 = Long.toString(gregoriancalendar.get(1));
            String s6 = Long.toString(gregoriancalendar.get(2) + 1);
            String s11 = Long.toString(gregoriancalendar.get(5));
            if(s6.length() == 1)
                s6 = "0" + s6;
            if(s11.length() == 1)
                s11 = "0" + s11;
            return s2 + "-" + s6 + "-" + s11;
        }
        if(s.equals("YYMMDD"))
        {
            String s3 = Long.toString(gregoriancalendar.get(1));
            s3 = s3.substring(2, 4);
            String s7 = Long.toString(gregoriancalendar.get(2) + 1);
            String s12 = Long.toString(gregoriancalendar.get(5));
            if(s7.length() == 1)
                s7 = "0" + s7;
            if(s12.length() == 1)
                s12 = "0" + s12;
            return s3 + s7 + s12;
        }
        if(s.equals("YY/MM/DD"))
        {
            String s4 = Long.toString(gregoriancalendar.get(1));
            s4 = s4.substring(2, 4);
            String s8 = Long.toString(gregoriancalendar.get(2) + 1);
            String s13 = Long.toString(gregoriancalendar.get(5));
            if(s8.length() == 1)
                s8 = "0" + s8;
            if(s13.length() == 1)
                s13 = "0" + s13;
            return s4 + "/" + s8 + "/" + s13;
        }
        if(s.equals("YYYY"))
            return Long.toString(gregoriancalendar.get(1));
        if(s.equals("MM"))
        {
            String s9 = Long.toString(gregoriancalendar.get(2) + 1);
            if(s9.length() == 1)
                s9 = "0" + s9;
            return s9;
        }
        if(s.equals("DD"))
        {
            String s14 = Long.toString(gregoriancalendar.get(5));
            if(s14.length() == 1)
                s14 = "0" + s14;
            return s14;
        }
        if(s.equals("WEEK"))
            return Integer.toString(gregoriancalendar.get(7));
        if(s.equals("WEEK_KR"))
        {
            int i = gregoriancalendar.get(7);
            switch(i)
            {
                case 1: // '\001'
                    return "\uC77C";

                case 2: // '\002'
                    return "\uC6D4";

                case 3: // '\003'
                    return "\uD654";

                case 4: // '\004'
                    return "\uC218";

                case 5: // '\005'
                    return "\uBAA9";

                case 6: // '\006'
                    return "\uAE08";

                case 7: // '\007'
                    return "\uD1A0";
            }
            return "";
        }
        if(s.equals("WEEK_EN"))
        {
            int j = gregoriancalendar.get(7);
            switch(j)
            {
                case 1: // '\001'
                    return "SUN";

                case 2: // '\002'
                    return "MON";

                case 3: // '\003'
                    return "TUE";

                case 4: // '\004'
                    return "WED";

                case 5: // '\005'
                    return "THU";

                case 6: // '\006'
                    return "FRI";

                case 7: // '\007'
                    return "SAT";
            }
            return "";
        } else
        {
            return "";
        }
    }

    // 8859_1 ->  KSC5601
    public static synchronized String E2K(String s){

        if(s ==null)  return "";
        if(s.trim().equalsIgnoreCase("null") || s.trim().equalsIgnoreCase("NULL"))
            return "";

        String s1 = null;

        try
        {
            s1 = new String(new String(s.getBytes("8859_1"), "KSC5601"));
        }
        catch(UnsupportedEncodingException _ex)
        {
            s1 = new String(s);
        }
        return s1;
    }
    // KSC5601 -> 8859_1
    public static synchronized String K2E(String s){
        String s1 = null;
        if(s == null)
            return null;
        s1 = new String(s);
        try
        {
            s1 = new String(new String(s.getBytes("KSC5601"), "8859_1"));
        }
        catch(UnsupportedEncodingException _ex)
        {
            s1 = new String(s);
        }
        return s1;
    }
    public static String nvl(String s, String s1){
		if(s == null )
			return s1;
		else
			return s.trim();
	}

	public static String nvl(String s){
		if(s == null )
			return "";
		else
			return s.trim();
	}
}
    


